package cn.zy.gvs.v1.core.handler;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.zy.gvs.v1.model.SysFile;
import cn.zy.gvs.v1.service.ISysFileService;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.recorder.FileRecorder;
import org.springframework.stereotype.Component;

/**
 * @author yann
 */
@Component
@RequiredArgsConstructor
public class FileRecorderHandler implements FileRecorder {

    private final ISysFileService sysFileService;

    /**
     * 保存文件
     * @param fileInfo
     * @return
     */
    @Override
    public boolean save(FileInfo fileInfo) {
        // 保存文件
        SysFile sysFile = new SysFile();
        sysFile.setFileName(fileInfo.getFilename());
        sysFile.setOriginalName(fileInfo.getOriginalFilename());
        sysFile.setFileSize(fileInfo.getSize().toString());
        sysFile.setFileSuffix(fileInfo.getExt());
        sysFile.setPlatform(fileInfo.getPlatform());
        sysFile.setCreateTime(DateUtil.now());
        sysFile.setUrl(fileInfo.getUrl());
        sysFile.setRelativePath(fileInfo.getPath());
        // #TODO 根据需要可以扩展文件信息表 和 储存字段
        // 使用用途
        if (fileInfo.getAttr() != null) {
            sysFile.setFileUse(fileInfo.getAttr().get("fileUse", "0"));
        }

        boolean b = sysFileService.save(sysFile);
        if (b) fileInfo.setId(sysFile.getId());
        return b;
    }

    @Override
    public FileInfo getByUrl(String url) {
        SysFile sysFile = sysFileService.getOne(lambdaUrl(url));
        FileInfo fileInfo = BeanUtil.copyProperties(sysFile, FileInfo.class);
        fileInfo.setOriginalFilename(sysFile.getOriginalName());
        fileInfo.setSize(Long.valueOf(sysFile.getFileSize()));
        fileInfo.setCreateTime(DateUtil.parseDateTime(sysFile.getCreateTime()));
        fileInfo.setPath(sysFile.getRelativePath());
        // #TODO 根据需要可以扩展文件信息表 和 储存字段
        if (fileInfo.getAttr() == null) {
            Dict dict = new Dict();
            dict.put("fileUse", sysFile.getFileUse());
            fileInfo.setAttr(dict);
        } else {
            fileInfo.getAttr().put("fileUse", sysFile.getFileUse());
        }

        return fileInfo;
    }

    @Override
    public boolean delete(String url) {
        // 通过访问全路径删除文件
        return sysFileService.remove(lambdaUrl(url));
    }

    private Wrapper<SysFile> lambdaUrl(String url) {
        return Wrappers.<SysFile>lambdaQuery().eq(SysFile::getUrl, url);
    }
}
